#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
Windows 7 兼容性打包工具
专为Windows 7 SP1及以上系统优化的PyInstaller打包配置

使用说明:
1. 直接运行: python build_exe.py (自动查找最新版本的主程序)
2. 指定脚本: python build_exe.py --script 你的脚本.py
3. 自定义名称: python build_exe.py --script 你的脚本.py --name 程序名称
4. 仅指定名称: python build_exe.py --name 程序名称 (自动查找脚本)

自动查找顺序:
- 根据字幕剪辑视频V0.0.3.py
- 根据字幕剪辑视频V0.0.2.py  
- 根据字幕剪辑视频V0.0.1.py
- 其他匹配的脚本文件
"""

import os
import sys
import subprocess
import shutil
import argparse
from pathlib import Path

def check_python_version():
    """检查Python版本是否适合Windows 7"""
    python_version = sys.version_info
    print(f"当前Python版本: {sys.version}")
    
    # Python 3.7是Windows 7官方支持的最后一个版本
    if python_version.major == 3 and python_version.minor <= 7:
        print("✓ Python版本适合Windows 7打包")
        return True
    else:
        print("⚠ 警告: 当前Python版本可能不适合Windows 7")
        print("建议使用Python 3.7.x版本以获得最佳Windows 7兼容性")
        return False

def check_pyinstaller():
    """检查PyInstaller是否已安装"""
    try:
        subprocess.run(["pyinstaller", "--version"], capture_output=True, check=True)
        return True
    except (subprocess.CalledProcessError, FileNotFoundError):
        return False

def install_pyinstaller():
    """安装PyInstaller"""
    print("正在安装PyInstaller...")
    subprocess.run(["pip", "install", "pyinstaller"], check=True)

def get_windows7_compatible_args():
    """获取Windows 7兼容性打包参数"""
    return [
        "--onefile",           # 单文件模式
        "--windowed",         # 窗口模式（不显示控制台）
        "--noconfirm",        # 不确认覆盖
        "--clean",            # 清理临时文件
        "--runtime-tmpdir", ".",  # 设置运行时临时目录
        # Windows 7兼容性关键参数 - 禁用UPX以避免DLL问题
        "--disable-windowed-traceback",  # 禁用窗口化跟踪
        "--bootloader-ignore-signals",   # 引导程序忽略信号
        # 隐藏导入确保兼容性
        "--hidden-import", "pysrt",
        "--hidden-import", "ffmpeg",
        "--hidden-import", "ffmpeg._run",
        "--hidden-import", "ffmpeg._probe",
        "--hidden-import", "requests",
        "--hidden-import", "zipfile",
        "--hidden-import", "shutil",
        "--hidden-import", "pathlib",
        "--hidden-import", "tkinter",
        "--hidden-import", "tkinter.ttk",
        "--hidden-import", "queue",
        "--hidden-import", "threading",
        "--hidden-import", "concurrent.futures",
        # 数据文件包含
        "--add-data", "FFmpegConfigurator.py;.",
    ]

def build_for_windows7(script_path, exe_name=None):
    """构建Windows 7兼容的EXE文件"""
    
    # 检查Python版本
    if not check_python_version():
        print("\n建议在Python 3.7环境中重新运行此脚本")
        print("或参考 Windows7_Python37_打包指南.txt 文件")
        
    # 检查PyInstaller
    if not check_pyinstaller():
        install_pyinstaller()
    
    # 确定EXE名称
    if not exe_name:
        exe_name = Path(script_path).stem
    
    print(f"开始构建Windows 7兼容的EXE文件: {script_path} -> {exe_name}.exe")
    
    # 获取Windows 7兼容性参数
    win7_args = get_windows7_compatible_args()
    
    # 构建基本命令 - 脚本文件路径应该放在最前面
    cmd = ["pyinstaller", str(script_path)]
    cmd.extend(win7_args)
    cmd.extend(["--name", exe_name])
    
    # 过滤空参数
    cmd = [arg for arg in cmd if arg]
    
    try:
        # 执行构建 - 使用Python模块方式调用PyInstaller以避免路径问题
        print(f"执行命令: {' '.join(cmd)}")
        
        # 使用Python模块方式调用PyInstaller
        python_cmd = [sys.executable, "-m", "PyInstaller"]
        python_cmd.extend(cmd[1:])  # 跳过第一个"pyinstaller"参数
        
        result = subprocess.run(python_cmd, capture_output=True, text=False, check=True)
        print("构建成功！")
        print("输出目录: dist/")
        
        # 检查生成的EXE文件
        exe_path = Path("dist") / f"{exe_name}.exe"
        if exe_path.exists():
            print(f"生成的EXE文件: {exe_path}")
            print(f"文件大小: {exe_path.stat().st_size / (1024*1024):.2f} MB")
            
            # 创建兼容性说明文件
            create_windows7_compatibility_instructions(exe_name)
            
            return True
        else:
            print("错误: EXE文件未生成")
            return False
            
    except subprocess.CalledProcessError as e:
        print(f"构建失败: {e}")
        if e.stderr:
            try:
                print(f"错误输出: {e.stderr.decode('utf-8', errors='ignore')}")
            except:
                print("错误输出: (无法解码)")
        return False

def create_windows7_compatibility_instructions(exe_name):
    """创建Windows 7兼容性说明文件"""
    instructions = f"""Windows 7 兼容性说明
====================

此EXE文件专为Windows 7系统设计，确保在Windows 7 SP1及以上版本中正常运行。

系统要求：
- Windows 7 SP1 或更高版本
- .NET Framework 4.5 或更高版本（通常已预装）
- 至少2GB内存
- 足够的磁盘空间用于视频处理

安装说明：
1. 将EXE文件复制到Windows 7电脑上
2. 无需安装，直接运行EXE文件即可
3. 程序会自动配置所需的FFmpeg工具

文件结构：
dist/
├── {exe_name}.exe          # 主程序
└── Windows7_兼容性说明.txt  # 本说明文件

功能特点：
- 支持SRT字幕文件解析
- 支持视频剪辑和合并
- 自动检测和配置FFmpeg
- 图形化用户界面

注意事项：
1. 首次运行可能需要较长时间（自动下载FFmpeg）
2. 确保网络连接以便自动下载依赖
3. 如果遇到权限问题，请以管理员身份运行

故障排除：
- 如果程序无法启动，请检查系统是否满足要求
- 确保有足够的磁盘空间（至少500MB空闲）
- 检查网络连接是否正常

技术支持：
如有问题，请检查程序生成的日志文件或联系开发者。
"""
    
    with open("Windows7_兼容性说明.txt", "w", encoding="utf-8") as f:
        f.write(instructions)
    print("已创建Windows 7兼容性说明文件: Windows7_兼容性说明.txt")

def find_main_script():
    """自动查找主程序脚本"""
    # 优先查找当前版本的主程序
    script_patterns = [
        "ClipVideoBySubtitle.py",           # 当前主程序文件名
        "ClipVideoBySubtitle_V*.py",       # 版本化文件名模式
        "根据字幕剪辑视频*.py"               # 中文文件名模式
    ]
    
    for pattern in script_patterns:
        for script_file in Path(".").glob(pattern):
            if script_file.exists():
                return script_file
    
    return None

def main():
    """主函数"""
    parser = argparse.ArgumentParser(description='Windows 7兼容性EXE打包工具')
    parser.add_argument('--script', help='要打包的Python脚本文件路径（可选，默认自动查找）')
    parser.add_argument('--name', '-n', help='生成的EXE文件名称（不包含扩展名）')
    
    args = parser.parse_args()
    
    # 自动查找脚本文件
    if not args.script:
        script_path = find_main_script()
        if not script_path:
            print("错误: 未找到主程序脚本文件")
            print("请手动指定脚本文件: python build_exe.py --script 你的脚本.py")
            return False
        args.script = str(script_path)
    
    # 检查脚本文件是否存在
    script_path = Path(args.script)
    if not script_path.exists():
        print(f"错误: 脚本文件 '{args.script}' 不存在")
        return False
    
    print("=" * 60)
    print("Windows 7兼容性EXE打包工具")
    print("=" * 60)
    print(f"目标脚本: {script_path}")
    if args.name:
        print(f"输出名称: {args.name}")
    else:
        print(f"输出名称: {script_path.stem}")
    print("=" * 60)
    
    # 构建Windows 7兼容的EXE
    success = build_for_windows7(args.script, args.name)
    
    if success:
        print("\n打包完成！")
        print("生成的EXE文件位于 dist/ 目录")
        print("请查看 Windows7_兼容性说明.txt 文件了解详细信息")
    else:
        print("\n打包失败，请检查错误信息")
    
    print("=" * 60)
    return success

if __name__ == "__main__":
    success = main()
    if success:
        sys.exit(0)
    else:
        sys.exit(1)